今天來講講各種ActionResult的型別,我們在DAY 3最後面的時候有說到,ActionResult類別其實是所有動作方法結果的基底類別,有許多的動作方法結果同樣是繼承ActionResult的。下面表格整理了一些ActionResult對應的動作方法返回結果:
ActionResult | 動作方法返回結果 | 說明 |
---|---|---|
ViewResult | View() | 顯示為網頁 |
PartialViewResult | PartialView() | 顯示部分檢視 |
RedirectResult | Redirect() | 重新導向到指定URL |
RedirectToRouteResult | RedirectToAction() / RedirectToRoute() | 重新導向到指定動作方法 |
ContentResult | Content() | 回傳指定型別文字檔內容 |
JsonResult | Json() | 回傳JSON物件 |
HttpNotFoundResult | HttpNotFound() | 回傳Http Erorr-404訊息 |
FileResult | File() | 回傳檔案內容 |
EmptyResult | null | 回傳空值(null)結果 |
接著我們針對幾個常用到的ActionResult舉幾個範例來實際說明:
ViewResult
型別會回傳指定的檢視頁面,當不指定檢視頁面名稱時,則回傳與動作方法同名的檢視頁面。
public ViewResult Index()
{
return View();
}
@{
ViewBag.Title = "ViewResult";
}
<h2>ViewResult</h2>
<div>
這是一個ViewResult的檢視頁面
</div>
回傳檢視頁面可以攜帶物件model,在檢視頁面裡透過Razor語法將物件內容呈現出來。
public List<Member> GetMembers()
{
var members = new List<Member>();
members.Add(new Member { Id = 1, Name = "Amy", Age = 18 });
members.Add(new Member { Id = 2, Name = "Bob", Age = 54 });
members.Add(new Member { Id = 3, Name = "Carol", Age = 27 });
return members;
}
// GET: ActionResult
public ViewResult Index()
{
var model = GetMembers();
return View(model);
}
以上在前面天數的範例已經做到快爛掉啦~就不再多說了。
PartialViewResult
型別會回傳部分檢視的頁面,範例如下:
public PartialViewResult ShowPartial()
{
return PartialView();
}
@{
ViewBag.Title = "ShowPartial";
}
<h2>ShowPartial</h2>
<div>
這是部分檢視的頁面,所以沒有Layout哦~
</div>
如下圖所示,雖然在加入檢視時有勾選「使用版面配置頁」,但執行時會發現Layout版面沒有了,僅會有原本HTML的頁面。
應用上會在View頁面裡使用@Html.Action()
方法來叫用PartialViewResult
動作方法,將PartialView組合加入至原本的View中,如下Code示範:
public ViewResult Index()
{
return View();
}
@{
ViewBag.Title = "ViewResult";
}
<h2>ViewResult</h2>
<div>
這是一個ViewResult的檢視頁面
</div>
@Html.Action("ShowPartial")
動作方法回傳RedirectToRouteResult
型別表示會依照指定路徑值執行重新導向的結果,例如系列文章前面常用到的RedirectToAction
,可以指定重新導向到哪個動作方法,如下Code:
public RedirectToRouteResult BackToIndex()
{
return RedirectToAction("Index");
}
另外一種回傳方式是使用RedirectToRoute
,重新導向到指定路由位置,下面範例是搭配啟用屬性路由的情況:
[RoutePrefix("Main")]
public class ActionResultController : Controller
{
[Route("MyHome")]
public ViewResult Index()
{
return View();
}
public PartialViewResult ShowPartial()
{
return PartialView();
}
public RedirectToRouteResult BackToIndex()
{
return RedirectToRoute("Main/MyHome");
}
}
動作方法回傳ContentResult
型別可以用來回傳文字內容,回傳結果除了字串內容以外,也可以指定內容類型與編碼,如下Code示範:
public ContentResult GetContent()
{
return Content("<h2 style=\"color:red\">あああああ</h2>", "text/html",Encoding.UTF8);
}
當指定內容類型為text/html
時,就可以依照字串內容轉成HTML格式了,另外遇到外國語言可以指定內容編碼以正確顯示內容。
Json()
方法可以將物件轉成JSON格式,使用時須搭配JsonRequestBehavior.AllowGet
以允許用戶端的HTTP GET要求,範例如下:
public JsonResult GetJson()
{
var members = new List<Member>();
members.Add(new Member { Id = 1, Name = "Amy", Age = 18 });
members.Add(new Member { Id = 2, Name = "Bob", Age = 54 });
members.Add(new Member { Id = 3, Name = "Carol", Age = 27 });
return Json(members,JsonRequestBehavior.AllowGet);
}
關於JSON格式的介紹與應用,預計在DAY 28會開一篇來說明~
HttpNotFoundResult
很好懂,直接參考範例比較快:
public HttpNotFoundResult Oops()
{
return HttpNotFound("找不到指定網頁內容 Q_Q");
}
HTTP 404或Not Found錯誤訊息是HTTP的其中一種「標準回應訊息」,代表客戶端在瀏覽網頁時,伺服器無法正常提供訊息,或是伺服器無法回應且不知原因。通常是因為使用者所存取的對應網頁已被刪除、移動或從未存在。
https://zh.wikipedia.org/zh-tw/HTTP_404
經過以上可以瞭解,動作方法不僅僅是可以回傳我們在前面常用到的View檢視頁面或重新導向,也還有許多可以回傳的結果,不過我們在撰寫動作方法時用ActionResult比較方便就是了~那麼今天就講到這邊,我們明天見!